package com.arpa.wms.service;

import com.arpa.core.web.Result;
import com.arpa.wms.domain.dto.DeliveryDistributionDTO;
import com.arpa.wms.domain.entity.DeliveryDistribution;
import com.arpa.wms.domain.entity.PickingRegister;
import com.arpa.wms.domain.vo.DeliveryDistributionVO;
import com.arpa.wms.domain.vo.DeliveryItemVO;
import com.arpa.wms.domain.vo.DeliveryItemWithDistributionVO;
import com.baomidou.mybatisplus.extension.service.IService;

import java.math.BigDecimal;
import java.util.List;

/**
 * <p>
 * 出货分配 服务类
 * </p>
 *
 * @author LEO
 * @since 2020-08-07
 */
public interface IDeliveryDistributionService extends IService<DeliveryDistribution> {

    /**
     * 保存
     *
     * @param entity
     * @return
     */
    @Override
    boolean save(DeliveryDistribution entity);


    /**
     * @Description: 批量保存分配库存
     */
    Result batchSave(DeliveryItemVO deliveryItemVO);

    /**
     * 根据code更新实体
     *
     * @param entity
     * @return
     */
    int updateByCode(DeliveryDistribution entity);

    /**
     * 查询列表
     *
     * @param deliveryDistributionDTO
     * @return
     */
    List<DeliveryDistributionVO> queryList(DeliveryDistributionDTO deliveryDistributionDTO);

    /**
     * 查询合计,包含总数
     *
     * @param deliveryDistributionDTO
     * @return
     */
    DeliveryDistributionVO queryListSum(DeliveryDistributionDTO deliveryDistributionDTO);

    /**
     * 根据出库表code获取分配与明细关联列表
     * @param deliveryCode
     * @return
     */
    List<DeliveryItemWithDistributionVO> queryWithItemList(String deliveryCode);

    /**
     * 根据发货单号、拣货单号查询关联明细的分配信息列表
     * @param deliveryCode
     * @param pickingCode
     * @return
     */
    List<DeliveryItemWithDistributionVO> queryWithItemList(String deliveryCode, String pickingCode);

    /**
     * 自动分配
     * @param deliveryCode
     * @return
     */
    Result autoDistribute(String deliveryCode);

    /**
     * 根据分配表code， 调整分配数量，正数表示增加，负数表示减少
     * @param deliveryDistributionDTO
     * @return
     */
    int adjustDistributionQuantity(DeliveryDistributionDTO deliveryDistributionDTO);

    /***
     * @description
     * 根据订单号，更新分配单拣货数量
     * @author xuyang
     * @date 2020/10/23 13:56
     * @param deliveryCode:
     **/
    int updatePickingQuantityForCheck(String deliveryCode,String groupCode);

    /**
     * 查询是否有相同的分配信息
     * @param itemCode
     * @param distributionCode
     * @return
     */
    DeliveryDistribution hasSameDistribution(String itemCode, String distributionCode);

    /**
     * 根据code更新实体，拣货单明细及拣货单数量
     *
     * @param entitys
     * @return
     */
    List<PickingRegister> updateDeliveryDistributions(List<DeliveryDistribution> entitys, boolean isUsePda, String wavePickingCode, String inventoryCode);

    /**
     * 根据code更新实体，拣货单明细及拣货单数量
     *
     * @param entitys
     * @return
     */
    List<PickingRegister> updateDeliveryDistributionsByLocation(List<DeliveryDistribution> entitys,String wavePickingCode, String location);

    /**
     * 复核缺货
     *
     * @param entitys
     * @return
     */
    Result recheckStockOut(List<DeliveryDistribution> entitys,String wavePickingCode,String inventoryCode,boolean isUsePda);

    /**
     * 根据库存编码获取出货分配 列表
     *
     * @param deliveryDistributionDTO
     * @return
     */
    List<DeliveryDistributionVO> queryListByInventoryCode(DeliveryDistributionDTO deliveryDistributionDTO,String source);

    /**
     * 根据波次号获取对应订单分配单关联的库存托盘号
     * @param wavePickingCode
     * @return
     */
    List<String> getContainerCodesForOutCheck(String wavePickingCode,String groupCode);

    /**
     * 根据订单号集合获取对应订单分配单关联的库存托盘号
     * @param deliveryCodes
     * @return
     */
    List<String> getContainerCodesForOutCheck(List<String> deliveryCodes,String groupCode);

    /**
     * 处理订单完全缺货的逻辑
     * @param wavePickingCode 波次号
     * @param operationType 操作类型
     */
    void handleWholeStockOutDelivery(String wavePickingCode,String operationType) ;

    /***
     * @description
     * 根据订单号，更新分配单拣货数量
     * @author xuyang
     * @date 2020/10/23 14:10
     * @param deliveryCode:
     * @param recheckQuantity:
     * @param oldInventoryCode:
     **/
    int updateRechekQuantity(String deliveryCode, String oldInventoryCode, BigDecimal recheckQuantity, BigDecimal recheckRefundQuantity,String groupCode);

    /**
     * 更新拣货数量
     * @author liuxr
     * @date 2021/12/10 12:57
     * @param wavePickingCode
     * @return int
     */
    int updatePickingQuantityStatusByWavePickingCode(String wavePickingCode,String status,String groupCode);

    /***
     * @description
     * 根据订单明细号，更新分配单复核数量
     * @author rfwang
     * @date 2022年3月16日
     * @param deliveryCode:
     * @param recheckQuantity:
     **/
    int updateRechekQuantityByItem(String deliveryCode, String deliveryItemCode, BigDecimal recheckQuantity, String groupCode);
}
